home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / picutil.exe / PIC2GMI.ASM < prev    next >
Assembly Source File  |  1986-06-03  |  19KB  |  479 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ ░░░░░░░░░░░ PROGRAM = PIC2IMG.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  3. ;╚═════════════════════════════════════════════════════════════════════════════╝
  4. CSEG           SEGMENT PUBLIC BYTE
  5.            ASSUME  CS:CSEG,DS:CSEG
  6.  
  7. CR           EQU     0DH
  8. LF           EQU     0AH
  9.  
  10. IMG           DB      'GMI',0
  11. PIC           DB      'PIC'
  12. FILENAME       DB      128 DUP(0)
  13. HANDLE_IN      DW      0
  14. HANDLE_OUT     DW      0
  15. TYPE_FROM      DW      0
  16.  
  17. LINES_PER_READ DW      0
  18. READS_PER_FILE DW      0
  19. BYTES_PER_READ DW      0
  20.  
  21. DISK_BUFFER    DD      0
  22.  
  23. ;44 BYTES
  24. IMG_NAME       DB      'FILE GENERATED FROM PCPAINT   '
  25. IMG_HEIGHT     DW      0
  26. IMG_WIDTH      DW      0
  27. IMG_WIDTH_BYTE DW      0
  28. IMG_PIX_SIZE   DW      1
  29. IMG_PIX_FMT    DW      0
  30. IMG_COLOR      DW      0
  31. IMG_COMPRESS   DW      0
  32.  
  33. PIC_PAGE       DW      1234H               ;START OF PAGE
  34. PIC_WIDTH      DW      0               ;WIDTH OF IMAGE
  35. PIC_HEIGHT     DW      0               ;HEIGHT OF IMAGE
  36. PIC_X_OFF      DW      0               ;X OFFSET OF PIC
  37. PIC_Y_OFF      DW      0               ;Y OFFSET OF PIC
  38. PIC_PIX_SIZE   DB      1               ;SIZE OF PEL
  39. PIC_2           DB      0FFH               ;PCPAINT 2.0
  40. PIC_MODE       DB      'G'                     ;TYPE OF DISPLAY
  41. PIC_DESC       DW      0               ;DESCRIPTOR
  42. PIC_COUNT      DW      0               ;COUNT
  43. PIC_BLOCK      DW      1               ;NUMBER OF PACKED BLOCKS
  44.  
  45. PIC_PAC_SZ     DW      0               ;NUMBER OF PACKED BYTES IN BLOCK
  46. PIC_NORM       DW      0               ;NUMBER OF BYTES UNPACKED
  47. PIC_ID           DB      0               ;IDENTIFIER
  48.  
  49. EIGHT           DW      8
  50.  
  51. TELL_HOW       DB      '┌──────────────────────────────────────────────┐',cr,lf
  52.            DB      '│ PIC2GMI filename.typ                         │',cr,lf
  53.            DB      '├──────────────────────────────────────────────┤',cr,lf
  54.            DB      '│ filename = PC-Paint Plus filename            │',cr,lf
  55.            DB      '│ typ      = must end in PIC                   │',cr,lf
  56.            DB      '├──────────────────────────────────────────────┤',cr,lf
  57.            DB      '│ Converts PIC file to reverse IMG file (GMI)  │',cr,lf
  58.            DB      '│ (top scan line on bottom)                    │',cr,lf
  59.            DB      '└──────────────────────────────────────────────┘',cr,lf
  60.            DB      7,'$'
  61. OPEN_ERROR     DB      'file not found...must end in PIC',cr,lf,'$'
  62. CREATE_ERROR   DB      'create error on output file',cr,lf,'$'
  63. ;╔═════════════════════════════════════════════════════════════════════════════╗
  64. ;║ ░░░░░░░░░░░ MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  65. ;╚═════════════════════════════════════════════════════════════════════════════╝
  66. MAIN           PROC    FAR
  67. ;┌─────────────────────────────────────────────────────────────────────────────┐
  68. ;│           RETURN SETUP                               │
  69. ;└─────────────────────────────────────────────────────────────────────────────┘
  70.            CLI
  71.            MOV     AX,CS               ;TEMP STACK
  72.            MOV     SS,AX               ;
  73.            MOV     ES,AX               ;
  74.            MOV     SP,OFFSET STACK           ;
  75.            STI
  76.            PUSH    DS               ;
  77.            XOR     AX,AX               ;
  78.            PUSH    AX               ;
  79.            CLD
  80. ;┌─────────────────────────────────────────────────────────────────────────────┐
  81. ;│           GET FILENAME FROM COMMAND LINE                       │
  82. ;└─────────────────────────────────────────────────────────────────────────────┘
  83.            MOV     SI,82H               ;START OF FILENAME
  84.            XOR     CH,CH               ;
  85.            MOV     CL,DS:[SI-2]           ;SIZE OF FILENAME
  86.            CMP     CX,0               ;NO COMMANDS
  87.            JE      GFN800               ;ERROR
  88.            MOV     DI,OFFSET FILENAME      ;STORE FILENAME HERE
  89. GFN100:
  90.            LODSB                   ;GET CHARACTER
  91.            CMP     AL,20H               ;END OF FILENAME?
  92.            JE      GFN900               ;YES....BRANCH
  93.            CMP     AL,CR               ;END OF COMMAND LINE?
  94.            JE      GFN900               ;YES....ERROR
  95.            STOSB                   ;SAVE CHARACTER
  96.            CMP     AL,'.'                  ;START OF TYPE
  97.            JNE     GFN200               ;
  98.            MOV     CS:TYPE_FROM,DI           ;START OF TYPE
  99. GFN200:
  100.            LOOP    GFN100               ;GET ANOTHER CHARACTER
  101.            JMP     SHORT GFN800           ;ERROR IF DONE ALREADY
  102. GFN800:
  103.            MOV     DX,OFFSET TELL_HOW      ;
  104.            JMP     ERROR               ;
  105. GFN900:
  106.            MOV     AL,0               ;PUT NULL AT END OF STRING
  107.            STOSB                   ;
  108.            CMP     WORD PTR CS:TYPE_FROM,0 ;
  109.            JNE     SET_BREAK
  110.            DEC     DI
  111.            MOV     CS:TYPE_FROM,DI
  112. ;┌─────────────────────────────────────────────────────────────────────────────┐
  113. ;│           TURN BREAK KEY ON                           │
  114. ;└─────────────────────────────────────────────────────────────────────────────┘
  115. SET_BREAK:
  116.            MOV     AX,CS               ;SET DATA SEGMENT
  117.            MOV     DS,AX               ;
  118.            CALL    BREAK_ON            ;SET UP CONTROL BREAK
  119. ;┌─────────────────────────────────────────────────────────────────────────────┐
  120. ;│           FIND DISK MEMORY                            │
  121. ;└─────────────────────────────────────────────────────────────────────────────┘
  122.            MOV     AX,OFFSET PROG_END      ;
  123.            MOV     BX,CS               ;
  124.            SHR     AX,1               ;
  125.            SHR     AX,1               ;
  126.            SHR     AX,1               ;
  127.            SHR     AX,1               ;
  128.            ADD     BX,AX               ;
  129.            ADD     BX,8               ;
  130.            MOV     WORD PTR DISK_BUFFER+2,BX      ;
  131. ;┌─────────────────────────────────────────────────────────────────────────────┐
  132. ;│           CHECK  FILENAME                               │
  133. ;└─────────────────────────────────────────────────────────────────────────────┘
  134.            MOV     SI,OFFSET PIC           ;CHANGE TYPE ON FILENAME
  135.            MOV     DI,TYPE_FROM           ;
  136.            MOV     CX,3               ;
  137.            AND     BYTE PTR [DI],0DFH        ;MAKE CAPITOL LETTER
  138.            AND     BYTE PTR [DI+1],0DFH        ;MAKE CAPITOL LETTER
  139.            AND     BYTE PTR [DI+2],0DFH        ;MAKE CAPITOL LETTER
  140.            REP     CMPSB               ;
  141.            JNE     OIF050
  142. ;┌─────────────────────────────────────────────────────────────────────────────┐
  143. ;│           OPEN INPUT FILE                               │
  144. ;└─────────────────────────────────────────────────────────────────────────────┘
  145.            MOV     AH,3DH               ;OPEN FILE FOR READ
  146.            MOV     AL,0H               ;
  147.            MOV     DX,OFFSET FILENAME      ;
  148.            INT     21H               ;
  149.            JNC     OIF100
  150. OIF050:
  151.            MOV     DX,OFFSET OPEN_ERROR    ;
  152.            JMP     ERROR
  153. OIF100:
  154.            MOV     HANDLE_IN,AX
  155. ;┌─────────────────────────────────────────────────────────────────────────────┐
  156. ;│           CHANGE FILENAME                               │
  157. ;└─────────────────────────────────────────────────────────────────────────────┘
  158.            MOV     SI,OFFSET IMG           ;CHANGE TYPE ON FILENAME
  159.            MOV     DI,TYPE_FROM           ;
  160.            MOV     CX,3               ;
  161.            REP     MOVSB               ;
  162. ;┌─────────────────────────────────────────────────────────────────────────────┐
  163. ;│           CREATE OUTPUT TEMP FILE                           │
  164. ;└─────────────────────────────────────────────────────────────────────────────┘
  165.            MOV     AH,3CH               ;
  166.            MOV     CX,20H               ;
  167.            MOV     DX,OFFSET FILENAME      ;
  168.            INT     21H               ;
  169.            JNC     COF100
  170.            MOV     DX,OFFSET CREATE_ERROR  ;
  171.            JMP     ERROR
  172. COF100:
  173.            MOV     HANDLE_OUT,AX
  174. ;┌─────────────────────────────────────────────────────────────────────────────┐
  175. ;│           READ PIC HEADER                               │
  176. ;└─────────────────────────────────────────────────────────────────────────────┘
  177.            MOV     AH,3FH
  178.            MOV     BX,HANDLE_IN
  179.            MOV     CX,19
  180.            MOV     DX,OFFSET PIC_PAGE
  181.            INT     21H
  182. ;┌─────────────────────────────────────────────────────────────────────────────┐
  183. ;│           TRANSLATE TO IMG HEADER                           │
  184. ;└─────────────────────────────────────────────────────────────────────────────┘
  185.            MOV     AX,PIC_HEIGHT           ;GET PIC HEIGHT
  186.            MOV     IMG_HEIGHT,AX           ;MOV TO IMG HEIGHT
  187.            MOV     AX,PIC_WIDTH           ;GET PIC WIDTH
  188.            MOV     IMG_WIDTH,AX           ;MOV TO IMG WIDTH
  189.            XOR     DX,DX
  190.            DIV     EIGHT
  191.            CMP     DX,0
  192.            JE      TT100
  193.            INC     AX
  194. TT100:
  195.            MOV     IMG_WIDTH_BYTE,AX       ;
  196. ;┌─────────────────────────────────────────────────────────────────────────────┐
  197. ;│           WRITE IMG HEADER                            │
  198. ;└─────────────────────────────────────────────────────────────────────────────┘
  199.            MOV     AH,40H
  200.            MOV     BX,HANDLE_OUT
  201.            MOV     CX,44
  202.            MOV     DX,OFFSET IMG_NAME
  203.            INT     21H
  204. ;┌─────────────────────────────────────────────────────────────────────────────┐
  205. ;│           MOVE PICTURE DATA BETWEEN FILES                       │
  206. ;└─────────────────────────────────────────────────────────────────────────────┘
  207. READ_BLOCK:
  208.            CALL    PROCESS_PAC
  209.            DEC     PIC_BLOCK
  210.            JZ      CLOSE_FILE
  211.            JMP     READ_BLOCK
  212. ;┌─────────────────────────────────────────────────────────────────────────────┐
  213. ;│           CLOSE FILES                               │
  214. ;└─────────────────────────────────────────────────────────────────────────────┘
  215. CLOSE_FILE:
  216.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  217.            MOV     AH,3EH               ;
  218.            INT     21H               ;
  219.            MOV     BX,HANDLE_OUT           ;CLOSE FILE
  220.            MOV     AH,3EH               ;
  221.            INT     21H               ;
  222.  
  223.            JMP     EXIT
  224. ERROR:
  225.            MOV     AX,CS
  226.            MOV     DS,AX
  227.            MOV     AH,9
  228.            INT     21H
  229. EXIT:
  230.            CALL    BREAK_OFF           ;BREAK KEY RESET
  231.            RET                   ;
  232. MAIN           ENDP
  233.  
  234. ;╔═════════════════════════════════════════════════════════════════════════════╗
  235. ;║ ░░░░░░░░░░░ PROCESS PACKET ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  236. ;╚═════════════════════════════════════════════════════════════════════════════╝
  237. PROCESS_PAC    PROC    NEAR
  238.  
  239.            CALL    READ_PAC_HDR
  240.            CALL    READ_PAC
  241.            CALL    EXPAND_PAC
  242.            CALL    IMG_WRITE
  243.            RET
  244.  
  245. PROCESS_PAC    ENDP
  246. ;╔═════════════════════════════════════════════════════════════════════════════╗
  247. ;║ ░░░░░░░░░░░ READ_PAC_HEADER ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  248. ;╚═════════════════════════════════════════════════════════════════════════════╝
  249. ;┌─────────────────────────────────────────────────────────────────────────────┐
  250. ;│           READ 5 BYTE PACKET HEADER                       │
  251. ;└─────────────────────────────────────────────────────────────────────────────┘
  252. READ_PAC_HDR   PROC    NEAR
  253.  
  254.            PUSH    AX               ;SAVE REGISTERS
  255.            PUSH    BX               ;
  256.            PUSH    CX               ;
  257.            PUSH    DX               ;
  258.                            ;
  259.            MOV     AH,3FH               ;
  260.            MOV     BX,HANDLE_IN           ;
  261.            MOV     CX,5               ;
  262.            MOV     DX,OFFSET PIC_PAC_SZ    ;
  263.            INT     21H               ;
  264.                            ;
  265.            POP     DX               ;RESTORE REGISTERS
  266.            POP     CX               ;
  267.            POP     BX               ;
  268.            POP     AX               ;
  269.            RET
  270.  
  271. READ_PAC_HDR   ENDP
  272. ;╔═════════════════════════════════════════════════════════════════════════════╗
  273. ;║ ░░░░░░░░░░░ READ PACKET ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  274. ;╚═════════════════════════════════════════════════════════════════════════════╝
  275. ;┌─────────────────────────────────────────────────────────────────────────────┐
  276. ;│           READ PACKET                               │
  277. ;└─────────────────────────────────────────────────────────────────────────────┘
  278. READ_PAC       PROC    NEAR
  279.  
  280.            PUSH    AX               ;SAVE REGISTERS
  281.            PUSH    BX               ;
  282.            PUSH    CX               ;
  283.            PUSH    DX               ;
  284.            PUSH    DS
  285.                            ;
  286.            MOV     AH,3FH               ;
  287.            MOV     BX,HANDLE_IN           ;
  288.            MOV     CX,PIC_PAC_SZ           ;
  289.            SUB     CX,5               ;NO NEED TO READ HEADER
  290.            LDS     DX,DISK_BUFFER           ;
  291.            INT     21H               ;
  292.                            ;
  293.            POP     DS
  294.            POP     DX               ;RESTORE REGISTERS
  295.            POP     CX               ;
  296.            POP     BX               ;
  297.            POP     AX               ;
  298.            RET
  299.  
  300. READ_PAC       ENDP
  301. ;╔═════════════════════════════════════════════════════════════════════════════╗
  302. ;║ ░░░░░░░░░░░ EXPAND PACKET ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  303. ;╚═════════════════════════════════════════════════════════════════════════════╝
  304. ;┌─────────────────────────────────────────────────────────────────────────────┐
  305. ;│           UNCOMPRESS PACKET                           │
  306. ;└─────────────────────────────────────────────────────────────────────────────┘
  307. EXPAND_PAC     PROC    NEAR
  308.  
  309.            PUSH    AX               ;SAVE REGISTERS
  310.            PUSH    BX               ;
  311.            PUSH    CX               ;
  312.            PUSH    DX               ;
  313.            PUSH    DI               ;
  314.            PUSH    SI               ;
  315.            PUSH    DS               ;
  316.            PUSH    ES               ;
  317.  
  318.            MOV     BX,PIC_PAC_SZ
  319.            SUB     BX,5               ;SUBTRACT HEADER
  320.            LES     DI,DISK_BUFFER           ;
  321.            ADD     DI,8000H            ;
  322.            LDS     SI,DISK_BUFFER           ;
  323. EP100:
  324.            LODSB
  325.            CMP     AL,CS:PIC_ID           ;START OF RUN?
  326.            JNE     EP700
  327.            LODSB
  328.            CMP     AL,0               ;16 BIT VALUE?
  329.            JNE     EP400               ;NO...BRANCH
  330.            LODSW                   ;GET WORD COUNT
  331.            MOV     CX,AX               ;SETUP COUNT REGISTER
  332.            LODSB                   ;GET DATA
  333.            REP     STOSB               ;
  334.            JMP     SHORT EP800
  335. EP400:
  336.            MOV     CL,AL               ;GET COUNT
  337.            XOR     CH,CH               ;
  338.            LODSB                   ;GET CHARACTER TO REPEAT
  339.            REP     STOSB               ;REPEAT CHARACTER
  340.            JMP     SHORT EP800           ;EXIT
  341. EP700:
  342.            STOSB                   ;STORE SINGLE CHARACTER
  343. EP800:
  344.            CMP     SI,BX
  345.            JNE     EP100               ;
  346.  
  347.            POP     ES               ;RESTORE REGISTERS
  348.            POP     DS               ;
  349.            POP     SI               ;
  350.            POP     DI               ;
  351.            POP     DX               ;
  352.            POP     CX               ;
  353.            POP     BX               ;
  354.            POP     AX               ;
  355.            RET
  356.  
  357. EXPAND_PAC     ENDP
  358. ;╔═════════════════════════════════════════════════════════════════════════════╗
  359. ;║ ░░░░░░░░░░░ IMAGE WRITE ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  360. ;╚═════════════════════════════════════════════════════════════════════════════╝
  361. ;┌─────────────────────────────────────────────────────────────────────────────┐
  362. ;│           WRITE IMAGE FILE                            │
  363. ;└─────────────────────────────────────────────────────────────────────────────┘
  364. IMG_WRITE      PROC    NEAR
  365.  
  366.            PUSH    AX               ;SAVE REGISTERS
  367.            PUSH    BX               ;
  368.            PUSH    CX               ;
  369.            PUSH    DX               ;
  370.            PUSH    DS
  371.  
  372.            MOV     AH,40H               ;
  373.            MOV     BX,HANDLE_OUT           ;
  374.            MOV     CX,PIC_NORM           ;
  375.            LDS     DX,DISK_BUFFER           ;
  376.            ADD     DX,8000H
  377.            INT     21H               ;
  378.  
  379.            POP     DS
  380.            POP     DX               ;RESTORE REGISTERS
  381.            POP     CX               ;
  382.            POP     BX               ;
  383.            POP     AX               ;
  384.            RET
  385.  
  386. IMG_WRITE      ENDP
  387. ;┌─────────────────────────────────────────────────────────────────────────────┐
  388. ;└─────────────────────────────────────────────────────────────────────────────┘
  389. EOI          EQU      20H              ;END OF INTERRUPT
  390. BRKINT          EQU      1BH              ;BREAK INTERRUPT
  391. SAV_BRK       DW       ?
  392. ;╔═════════════════════════════════════════════════════════════════════════════╗
  393. ;║ ░░░░░░░░░░ BREAK_ON ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  394. ;╚═════════════════════════════════════════════════════════════════════════════╝
  395.           PUBLIC   BREAK_ON
  396. BREAK_ON      PROC     NEAR
  397.           PUSH     AX
  398.           PUSH     BX               ;SAVE REGISTERS
  399.           PUSH     CX               ;
  400.           PUSH     DX               ;
  401.           PUSH     SI               ;
  402.           PUSH     ES               ;
  403.  
  404.           XOR      BX,BX               ;SEGMENT 0
  405.           MOV      ES,BX               ;
  406.           MOV      SI,BRKINT*4           ;OFFSET OF INTERUPT VECTOR
  407.  
  408.           MOV      CX,ES:WORD PTR[SI]      ;OFFSET OF CURRENT VECT
  409.           MOV      DX,ES:WORD PTR[SI+2]    ;SEGMENT OF CURRENT VECT
  410.           MOV      CS:SAV_BRK,CX           ;SAVE OFFSET
  411.           MOV      CS:SAV_BRK+2,DX           ;SAVE SEGMENT
  412.  
  413.           MOV      AX,OFFSET BREAK           ;
  414.           CLI                   ;NO INTERRUPTS
  415.           MOV      ES:WORD PTR[SI],AX      ;SET OFFSET
  416.           MOV      AX,CS               ;SET THIS CODE SEGMENT
  417.           MOV      ES:WORD PTR[SI+2],AX    ;MOVE SEG ADDR TO INT.VECT
  418.           STI                   ;INTERRUPTS BACK ON
  419.  
  420.           POP      ES               ;RESTORE REGISTERS
  421.           POP      SI               ;
  422.           POP      DX               ;
  423.           POP      CX               ;
  424.           POP      BX               ;
  425.           POP      AX               ;
  426.           RET                   ;
  427. BREAK_ON      ENDP
  428. ;╔═════════════════════════════════════════════════════════════════════════════╗
  429. ;║ ░░░░░░░░░░ BREAK_OFF ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  430. ;╚═════════════════════════════════════════════════════════════════════════════╝
  431.           PUBLIC   BREAK_OFF
  432. BREAK_OFF     PROC     NEAR
  433.  
  434.           PUSH     AX               ;
  435.           PUSH     CX               ;
  436.           PUSH     DX               ;
  437.           PUSH     DI               ;
  438.           PUSH     ES               ;
  439.  
  440.           XOR      AX,AX               ;
  441.           MOV      ES,AX               ;SEGMENT 0
  442.           MOV      CX,CS:SAV_BRK           ;RESET VECTOR BACK TO OLD RTN
  443.           MOV      DX,CS:SAV_BRK+2           ;
  444.           MOV      DI,BRKINT*4           ;
  445.           CLI                   ;NO INTERRUPTS
  446.           MOV      ES:WORD PTR[DI],CX      ;
  447.           MOV      ES:WORD PTR[DI+2],DX    ;
  448.           STI                   ;INTERRUPTS BACK ON
  449.  
  450.           POP      ES               ;
  451.           POP      DI               ;
  452.           POP      DX               ;
  453.           POP      CX               ;
  454.           POP      AX               ;
  455.           RET                   ;
  456. BREAK_OFF     ENDP
  457. ;╔═════════════════════════════════════════════════════════════════════════════╗
  458. ;║ ░░░░░░░░░░ BREAK ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║ J
  459. ;╚═════════════════════════════════════════════════════════════════════════════╝
  460.           PUBLIC   BREAK
  461. BREAK          PROC     FAR
  462.  
  463.           MOV      AX,CS
  464.           MOV      DS,AX
  465.           MOV      AL,EOI               ;
  466.           OUT      020H,AL               ;
  467.           CALL     BREAK_OFF
  468.           MOV      SP,OFFSET STACK-4       ;
  469.           RET
  470.  
  471. BREAK          ENDP
  472. ;┌─────────────────────────────────────────────────────────────────────────────┐
  473. ;└─────────────────────────────────────────────────────────────────────────────┘
  474.            DB      64 DUP('STACK')
  475. STACK           EQU     $
  476. PROG_END       EQU     $
  477. CSEG           ENDS
  478.            END     MAIN
  479.